/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package statusProduto;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import statusProduto.StatusProduto;
import util.ErroAcessoRepositorioException;
import util.HibernateUtil;

/**
 *
 * @author Alberto
 */
public class RepositorioStatusProduto implements IRepositorioStatusProduto{
     /**
     * Mensagem que indica erro de acesso ao banco de dados.
     */
    private static final String MSG_ERRO_ACESSO_BD = "Erro de acesso ao banco de dados";
    
     /**
     * Método que ira cadastrar / atualizar os objetos StatusProduto da base
     * @param objStatusProduto 
     */
    public void cadastrarAtualizar(StatusProduto objStatusProduto) throws ErroAcessoRepositorioException{
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            // salvando na base
            s.saveOrUpdate(objStatusProduto);
           
            // Comtando tudo caso der certo
            t.commit();
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
    }
    
    /**
     * Método que ira procurar na base o status do produto pelo seu identificador
     * 
     * @param idStatusProduto
     * @return StatusProduto
     */
    public StatusProduto procurar(int idStatusProduto) throws ErroAcessoRepositorioException{
        StatusProduto objStatusProduto = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            // Procurando na base de dados 
            objStatusProduto = (StatusProduto) s.get(StatusProduto.class, idStatusProduto);
            
            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
        
        return objStatusProduto;
    }
    
    /**
     * Método que ira verificar a existencia de um determinado objeto na base
     * 
     * @param idStatusProduto
     * @return boolean
     */
    public boolean existe(int idStatusProduto)throws ErroAcessoRepositorioException{
        StatusProduto objStatusProduto = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            // Procurando na base de dados 
            objStatusProduto = (StatusProduto) s.get(StatusProduto.class, idStatusProduto);
            
            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
        }
        return (objStatusProduto != null);
    }
    
    /**
     * Método que ira listar os objetos da base por uma determinada condição ou não
     * @param strComplemento
     * @return List<StatusProduto>
     */
    public List<StatusProduto> listar(String strComplemento) throws ErroAcessoRepositorioException{
        List<StatusProduto> listStatusProduto = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            // Criando a query
            Query q = s.createQuery("from StatusProduto  WHERE id_status_produtos IS NOT NULL " + strComplemento);
            
            // Listando na base
            listStatusProduto = q.list();
            
            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
             throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
        return listStatusProduto;
    }
    
    /**
     * Método que ira remover um objeto da base pelo seu identificador
     * 
     * @param idStatusProduto 
     */
    public void remover(int idStatusProduto) throws ErroAcessoRepositorioException{
        StatusProduto objStatusProduto = null;
        if (this.existe(idStatusProduto)) {
            Session s = null;
            Transaction t = null;
            try {

                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = s.beginTransaction();
                t.begin();
                // Recupero o meu produto
                objStatusProduto = (StatusProduto) s.get(StatusProduto.class, idStatusProduto);

                // Seto seu id como excluido
                objStatusProduto.setStatusProduto(false);
                
                // Comtando tudo caso der certo
                t.commit();
                
                // atualizando o objeto na base
                this.cadastrarAtualizar(objStatusProduto);

            } catch (Exception e) {
                t.rollback();

            }
        } else {
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
        }
        
    }
}
